//////////////////////////////////////////////////////////////////////////
// 
// NO_Scope
// 
//////////////////////////////////////////////////////////////////////////
#ifndef	NO_Scope_H
#define NO_Scope_H

//////////////////////////////////////////////////////////////////////////
// class NO_BaseFriend definition
//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_TypeFriend  
{
protected:
	//////////////////////////////////////////////////////////////////////////
	NO_Type*	getNext	(const NO_Type*)		const;
	void		setNext	(NO_Type*, NO_Type*)	const;
	void		setID	(NO_Type*, NO_UInt32)	const;
};

//////////////////////////////////////////////////////////////////////////
// class NO_TypeList definition
//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_Scope  : public NO_TypeFriend
{
public:
	//////////////////////////////////////////////////////////////////////
	// con/destruction
	//////////////////////////////////////////////////////////////////////
	
	//////////////////////////////////////////////////////////////////////
	NO_Scope(void);
	~NO_Scope(void);
	
	//////////////////////////////////////////////////////////////////////////
	// modify
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	NO_Boolean addType(NO_Type*);
	
	//////////////////////////////////////////////////////////////////////////
	// retrieve
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	const NO_Type * findTypeImpl(const NO_Int8* name)	const;
	const NO_Type * findTypeImpl(NO_UInt32 ID)			const;

	//////////////////////////////////////////////////////////////////////////
	NO_Type	const *  beginTypeImpl	(void) const;
	NO_Type	const *  endTypeImpl	(void) const;
	NO_Type	const *  nextTypeImpl	(const NO_Type * ) const;

private:
	//////////////////////////////////////////////////////////////////////////
	NO_Type* first;
	NO_Type* last;
};

//////////////////////////////////////////////////////////////////////////
// class NO_TypeList definition
//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_NoneScope 
{
public:
	//////////////////////////////////////////////////////////////////////
	typedef NO_IDSet<NO_Type,2>		Types;
	typedef Types::const_iterator	TypeIter;

	//////////////////////////////////////////////////////////////////////
	// con/destruction
	//////////////////////////////////////////////////////////////////////
	
	//////////////////////////////////////////////////////////////////////
	NO_NoneScope(void);
	~NO_NoneScope(void);
	
	//////////////////////////////////////////////////////////////////////////
	// retrieve
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	const NO_Type * findTypeImpl(const NO_Int8* name)	const;
	const NO_Type * findTypeImpl(NO_UInt32 ID)			const;

	//////////////////////////////////////////////////////////////////////////
	const NO_Type * beginTypeImpl	(void) const;
	const NO_Type * endTypeImpl		(void) const;
	const NO_Type * nextTypeImpl	(const NO_Type *) const;
};

#endif

